// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from 'vscode';

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {

	// Use the console to output diagnostic information (console.log) and errors (console.error)
	// This line of code will only be executed once when your extension is activated
	console.log('Congratulations, your extension "easy-include" is now active!');

	// The command has been defined in the package.json file
	// Now provide the implementation of the command with registerCommand
	// The commandId parameter must match the command field in package.json
	let disposable = vscode.commands.registerCommand('easyinclude.addInclude', () => {
		// The code you place here will be executed every time your command is executed

		// Display a message box to the user
		vscode.window.showInputBox({
			prompt: `请输入你想要 #include 的头文件名称(用>或"开头明确包围形式):`,
			validateInput: value => {
				if (value.trim().length === 0) {
					return '请输入有效的包含文件';
				}

				return null;
				// 陈旧的逻辑： 如果长度为0、如果只有前面没有后面的"或者<>
				// if (value.length === 0) {
				// 	return 'Enter a valid include file';
				// } else if (value[0] === '\"' && value[value.length -1] !== '\"') {
				// 	return `\`#include ${value}\` is not a valid include statement.`
				// } else if (value[0] === '<' && value[value.length -1] !== '>') {
				// 	return `\`#include ${value}\` is not a valid include statement.`
				// } else {
				// 	return null;
				// }
			}
		}).then(value => {
			if (value) {
				// 包围计算
					// 不存在包围时，使用 <>
				
				if (value[0] !== '<' && value[0] !== '\"' && value[0] !== '>') {
					value = `<${value}>`;
				} else if (value[0] === '>') {
					value = value.substring(1)
					value = `<${value}>`;
				} else if (value[0] === '"' && value[value.length -1] !== '"') {
					value =  `${value}"`;
				}

				// 获取一个有效的编辑器，可能具有焦点，否则不进行处理
					// 获取全文，并使用正则查找一个即将插入的位置
					// /[ \t]* 		任何可能有空格的的开始
					// #\s* 		接着是 # 与可能包含任何空格的部分
					// ()  			抓取一个匹配点
						// 第一种匹配
							// include\s	这个点开头为 include 与单个任意空白
								// +[<\"]       追加可能的部分  < 或 "
								// [^>\"]*      紧接着是       非 > 或 " 部分
								// [>\"]		紧接着是       > 或 " 部分
						// 第二种匹配
							// \s* 			任意空白
							// pragma		紧接着是   pragma (所以这是一个关键点)
							// \s*			任意空白
							// once			紧接着是   once (所以这是一个关键点)
							// \s*			任意空白
				const editor = vscode.window.activeTextEditor;
				if (editor) {
					const text = editor.document.getText();
					const regex = /[ \t]*#\s*(include\s+[<\"][^>\"]*[>\"]\s|\s*pragma\s*once\s)/g;
					var match;

					// 插入位置
						// 一直接进行向下匹配，如果发现了没有了，这个点就是插入点
					var insertOffset = 0;
					do {
						match = regex.exec(text);
						if (match) {	// 找到结果的搜索的索引
										// 在索引的起始位置，计算索引的长度并向后移一位
							insertOffset = match.index + match[0].length + 1; 
						}
					} while (match);

					editor.edit((editBuilder) => {
						editBuilder.insert(
							editor.document.positionAt(insertOffset),
							`#include ${value}\n`)
					});
				}
			}
		});
	});

	context.subscriptions.push(disposable);
}

// this method is called when your extension is deactivated
export function deactivate() { }
